#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QtMultimedia>

//场景设置：行数和列数
const int AREA_ROW=20;
const int AREA_COL=12;

//场景设置：边距
const int MARGIN=5;

//单个方块单元的边长
const int BLOCK_SIZE=25;

//方向
enum Direction{
    UP, DOWN, RIGHT, LEFT, SPACE
};

//定义边界
struct Border{
    int ubound;  // 上边界
    int dbound;  // 下边界
    int lbound;  // 左边界
    int rbound;  // 右边界
};

//定义坐标
struct block_point{
    int pos_x, pos_y;
};

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWidget;
}
QT_END_NAMESPACE

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();

protected:
    void timerEvent(QTimerEvent *event) override;
    void keyPressEvent(QKeyEvent *event) override;
    void paintEvent(QPaintEvent *event) override;

private slots:
    void InitGameFunc();
    void StartGameFunc();
    void GameOverFunc();
    void ResetBlock();        // 重置方块
    void BlockMove(Direction dir);  // 方块移动
    void BlockRotate(int block[4][4]);  // 方块旋转
    void CreateBlock(int block[4][4], int block_id);  // 产生方块
    void GetBorder(int block[4][4], Border &border);  // 计算边界
    void ConvertStable(int x, int y);  // 转换为稳定方块
    bool IsCollide(int x, int y, Direction dir);  // 判断是否碰撞
    bool IsCollide(int x, int y, Direction dir, int block[4][4]);  // 重载版本
    void CheckLines();  // 检查并消除已满的行

private:
    Ui::MainWidget *ui;

    // 场景区域 1表示活动的方块 2表示稳定的方块 0表示为空
    int game_area[AREA_ROW][AREA_COL];

    // 当前方块形状
    int current_block[4][4];  // 与实现文件保持一致

    // 下一个方块形状
    int next_block[4][4];

    // 当前方块坐标
    block_point block_pos;    // 使用结构体

    // 当前方块边界
    Border cur_border;

    // 游戏分数
    int score;

    // 方块下落计时器
    int game_timer;

    // 渲染刷新计时器
    int paint_timer;

    // 下落时间间隔
    int speed_ms;

    // 刷新时间间隔
    int refresh_ms;

    // 游戏是否结束
    bool game_over;

    // 判断当前方块是否稳定（可选，根据需要使用）
    bool isStable;
};

#endif // MAINWIDGET_H
